跳到主要内容

Java JSP 学习~

JSP 是什么?

JSP(全称Java Server Pages)是以 Java 语言作为脚本语言的,JSP 网页为整个服务器端的 Java 库单元提供了一个接口来服务于 HTTP 的应用程序。

添加依赖:

<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jasper-el</artifactId>
<version>${tomcat.version}</version>
</dependency>

<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jsp-api</artifactId>
<version>${tomcat.version}</version>
</dependency>

JSP文件后缀名为 *.jsp

<html>
<head>
<title>My Frist JSP Application</title>
</head>
<body>
<%
out.println("Hello World!");
%>
</body>
</html>

JSP 处理过程

以下步骤表明了 Web 服务器是如何使用JSP来创建网页的:

就像其他普通的网页一样,浏览器发送一个 HTTP 请求给服务器。

Web 服务器识别出这是一个对 JSP 网页的请求,并且将该请求传递给 JSP 引擎。通过使用 URL或者 .jsp 文件来完成。

JSP 引擎从磁盘中载入 JSP 文件,然后将它们转化为 Servlet。这种转化只是简单地将所有模板文本改用 println() 语句,并且将所有的 JSP 元素转化成 Java 代码。

JSP 引擎将 Servlet 编译成可执行类,并且将原始请求传递给 Servlet 引擎。

Web 服务器的某组件将会调用 Servlet 引擎,然后载入并执行 Servlet 类。在执行过程中,Servlet 产生 HTML 格式的输出并将其内嵌于 HTTP response 中上交给 Web 服务器。

Web 服务器以静态 HTML 网页的形式将 HTTP response 返回到浏览器中。

最终,Web 浏览器处理 HTTP response 中动态产生的HTML网页,就好像在处理静态网页一样。

一般情况下,JSP 引擎会检查 JSP 文件对应的 Servlet 是否已经存在,并且检查 JSP 文件的修改日期是否早于 Servlet。如果 JSP 文件的修改日期早于对应的 Servlet,那么容器就可以确定 JSP 文件没有被修改过并且 Servlet 有效。这使得整个流程与其他脚本语言(比如 PHP)相比要高效快捷一些。

总的来说,JSP 网页就是用另一种方式来编写 Servlet。除了解释阶段外,JSP 网页几乎可以被当成一个普通的 Servlet 来对待。

JSP 和 Servlet 的关系

JSP 的本质就是 Servlet,在 Tomcat 访问任何的资源都是在访问 Servlet!JSP 本身就是一种Servlet。JSP 在第一次被访问的时候会被编译为 HttpJspPage 类(该类是 HttpServlet 的一个子类)

如下简单编写一个 JSP 页面

<html>
<head>
<title>My Frist JSP Application</title>
</head>
<body>
<%
out.println("Hello World!");
%>
</body>
</html>

观察 target 目录,可以发现生成了一个 class 文件

点进里面可以发现里面就是一个 Servlet

// ...

// 这里省略 Servlet 那部分代码
response.setContentType("text/html");

// ...

out.write("<html>\n");
out.write(" <head>\n");
out.write(" <title>My Frist JSP Application</title>\n");
out.write(" </head>\n");
out.write(" <body>\n");
out.write(" ");
out.println("Hello World!");

out.write("\n");
out.write(" </body>\n");
out.write("</html>\n");

静态 include 和动态 include 的区别

JSP 的 include 是什么?

include 指令用于在编译阶段包括一个文件。这个指令告诉容器在编译阶段将其他外部文件的内容合并到当前 JSP 文件中。

可在 JSP 页面的任何位置使用 include 指令进行编码。

动态 include 说白了就是把另外一个文件的输出内容插入当前 JSP 页面的输出内容中,这种在 JSP 页面执行时引入的方式称为动态引入,这样,主页面程序与被包含文件是彼此独立的,互不影响。被包含的文件可以是一个动态文件(JSP 文件),也可以是一个静态文件(如文本文件)。

静态页面

1、静态 include 用 include 伪码实现,不会检查所含文件的变化,适用于包含静态页面

2、格式: <%@include file="include.jsp"%>

3、静态页面是先将文件的代码被原封不动地加入到了主页面从而和合成一个文件,然后再进行编译(例如 easyUI 就是一个单页面)

动态页面

1、动态 include 用 jsp.include 动作实现

2、格式: <jsp: include page="included.jsp" flush="true"/>

3、它总是检查所包含的文件中的变化,适用于包含动态页面,并且还可以带参数,各个文件分别先编译,然后合成一个文件

两者的区别

静态导入时将导入页面的代码完全融入,两个页面融合成一个整体的 servlet,而动态导入则是在 servlet 中使用 include 方法来引入被导入页面的内容

静态导入时被导入的页面编辑指令会起作用,而动态导入被导入页面的指令则失去作用,只是插入页面的 body 内容

动态页面可以包含相同的变量,而静态则不能包含相同的变量

如果被包含文件经常变动,则应该使用动态包含,而使用静态包含时,改变被包含文件后,有可能不能及时更新

Reference